<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    /*
        0.简单的使用
     */
    let obj = {}
    try {
        obj.getName();
    } catch (e) {
        console.log('error', [e])
    }
    
    /*
           TypeError实例
            message:'obj.getName is not a function'
            stack:'xxx...'
            __proto__:Error
                constructor:f TypeError()
                message:'',
                name:'TypeError'
     */
    
    /*
        1. finally 子句
        如果 try 块中的代码运行完，则接着执行finally块中的代码。
        如果出错并执行 catch 块中的代码，则 finally 块中的代码仍执行。
        try 或 catch 块无法阻止 finally 块执行，包括 return 语句
            
     */
    function testFinally() {
        try {
            console.log('2')
            obj.getName()
            return 2
        }catch (e) {
            console.log('1')
            return 1
        }finally {
            console.log('0')
            return 0;
        }
    }

    console.log(testFinally())  // 2  1  0
    
    
    /*
        2.错误类型
         Error   是爸爸,下面的都是孙子
         InternalError 
         EvalError   eval里面出错 比如 new eval()  eval = foo
         RangeError   比如new Array(-20)
         ReferenceError  let obj = x // x没有生命
         SyntaxError  // js语法错误 eval('a++b')
         TypeError   // 最常见  let o = new 10; 'name' in true;
         URIError   // encodeURI()或 decodeURI()传入了错误的参数
     */
    
</script>